#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Importacion de modulos
import pygtk
pygtk.require('2.0')
import gtk, gtk.glade, inspect, sys, string, UserList,os,math
#rc_parse("Estilo")
import gtksourceview2 as gtkview
#import pdb
from Utilidades import Util
from ConfigurarTraductor import config

class Traductor:
    
    def __init__(self):
	
	#Se importa el archivo .glade
	self.w_tree = gtk.glade.XML('/usr/local/share/Lazarillo/Interfaz.glade')
	self.Traductor = self.w_tree.get_widget('Traductor')
	self.Traductor.set_icon_from_file("/usr/local/share/pixmaps/Lazarillo.png")
			
	# Widgets del menu Archivo
	self.m_Nuevo = self.w_tree.get_widget ('m_Nuevo')
	self.m_Abrir_Texto = self.w_tree.get_widget ('m_Abrir_Texto')
	self.m_Abrir_Traduccion = self.w_tree.get_widget ('m_Abrir_Traduccion')
	self.m_Matematica = self.w_tree.get_widget ('m_Matematica')
	self.m_Traduccion = self.w_tree.get_widget ('m_Traduccion')
	self.m_Guardar_C_Texto = self.w_tree.get_widget ('m_Guardar_C_Texto')
	self.m_Guardar_C_Traduccion = self.w_tree.get_widget ('m_Guardar_C_Traduccion')
	self.m_Cambiar_Traduccion = self.w_tree.get_widget ('m_Cambiar_Traduccion')
	self.m_Elegir_Perfil = self.w_tree.get_widget ('m_Elegir_Perfil')
	self.m_Imprimir = self.w_tree.get_widget ('m_Imprimir')
	self.m_Salir = self.w_tree.get_widget ('m_Salir')
	
	# Widgets del menu Editar
	self.m_Deshacer = self.w_tree.get_widget ('m_Deshacer')
	self.m_Rehacer = self.w_tree.get_widget ('m_Rehacer')
	self.m_Cortar = self.w_tree.get_widget ('m_Cortar')
	self.m_Copiar = self.w_tree.get_widget ('m_Copiar')
	self.m_Pegar = self.w_tree.get_widget ('m_Pegar')
	self.m_Revisar_sintaxis = self.w_tree.get_widget ('m_Revisar_sintaxis')
	self.m_Seleccionar_todo = self.w_tree.get_widget ('m_Seleccionar_todo')

	#Widgets del menú Buscar
	self.Ir_a = self.w_tree.get_widget ('Ir_a')

	# Widgets del menu Traducir
	self.m_Braille_Grado_1 = self.w_tree.get_widget ('m_Braille_Grado_1')
		
	# Widgets del menu Ayuda
	self.m_Manual_Ayuda = self.w_tree.get_widget ('m_Manual_Ayuda')
	self.m_Acerca_de = self.w_tree.get_widget ('m_Acerca_de')
	
	# Widgets del menu de accesos directos Caja_botones
	self.Caja_botones = self.w_tree.get_widget ('Caja_botones')
	self.Nuevo = self.w_tree.get_widget ('Nuevo')
	self.Abrir = self.w_tree.get_widget ('Abrir')
	self.Guardar = self.w_tree.get_widget ('Guarda')
	self.Deshacer = self.w_tree.get_widget ('Deshacer')
	self.Rehacer = self.w_tree.get_widget ('Rehacer')
	self.Cortar = self.w_tree.get_widget ('Cortar')
	self.Copiar = self.w_tree.get_widget ('Copiar')
	self.Pegar = self.w_tree.get_widget ('Pegar')
	#Botones insertados por Pygtk
	self.Traducir = gtk.Button(label="T_raducir", stock=None, use_underline=True)
	#Se Fija el botón sin relieve
	self.Traducir.set_relief(gtk.RELIEF_NONE)
	#Se Fija imagen del botón
	self.image = gtk.Image()
	self.image.set_from_file("/usr/local/share/pixmaps/Lazarillo.png")
	self.Traducir.set_image(self.image)
	#Falta fijar posición de la imagen en el botón: gtk.POS_TOP
	self.Traducir.add(self.image)
	self.Orca = gtk.Button(label=" Acceder a \n    ORCA", stock=None, use_underline=True)
	self.image1 = gtk.Image()
	self.image1.set_from_file("/usr/local/share/pixmaps/ORCA.png")
	self.Orca.set_image(self.image1)
	self.Orca.add(self.image1)
	self.Orca.set_relief(gtk.RELIEF_NONE)
	#Combo desplegable para cambiar tamaño del texto editado
	self.Tam_texto=gtk.combo_box_new_text()
	#Se llena el combo
	self.Tam_texto.append_text('6')
        self.Tam_texto.append_text('7')
        self.Tam_texto.append_text('8')
        self.Tam_texto.append_text('9')
        self.Tam_texto.append_text('10')
        self.Tam_texto.append_text('11')
	self.Tam_texto.append_text('12')
	self.Tam_texto.append_text('13')
	self.Tam_texto.append_text('14')
	self.Tam_texto.append_text('15')
	self.Tam_texto.append_text('16')
	self.Tam_texto.append_text('17')
	self.Tam_texto.append_text('18')
	self.Tam_texto.append_text('20')
	self.Tam_texto.append_text('22')
	self.Tam_texto.append_text('24')
	self.Tam_texto.append_text('26')
	self.Tam_texto.append_text('28')
	self.Tam_texto.append_text('32')
	self.Tam_texto.append_text('36')
	self.Tam_texto.append_text('40')
	self.Tam_texto.append_text('48')
	self.Tam_texto.append_text('56')
	self.Tam_texto.append_text('64')
	self.Tam_texto.append_text('72')
	#Se fija el valor a mostrar como tamaño de fuente predeterminado por la aplicación
	self.Tam_texto.set_active(6)# Se fija por el índice

	#Se colocan los botones en la Caja de botones dispuesta para los accesos directos
	self.Caja_botones.pack_start(self.Tam_texto,expand=False,fill=False,padding=0)
	self.Caja_botones.pack_start(self.Traducir,expand=False,fill=False,padding=0)
	self.Caja_botones.pack_start(self.Orca,expand=False,fill=False,padding=0)
	
        # Barras de desplazamiento
	self.Barras = self.w_tree.get_widget ('Barras')
	self.Barras.modify_bg(gtk.STATE_NORMAL,gtk.gdk.Color(65535,63000,50000))	
	# Area de edicion de texto
	self.buf = gtkview.Buffer()
	self.Texto = gtkview.View(self.buf)
	self.Barras.add(self.Texto)
	self.display = gtk.gdk.display_manager_get().get_default_display()
	self.clipboard = gtk.Clipboard(self.display, "CLIPBOARD")
	self.startiter = self.buf.get_start_iter()
	self.enditer = self.buf.get_end_iter()
	#pdb.set_trace()
	
	#Para colocar el título de la traducción
	self.Titulo_Traduccion = self.w_tree.get_widget ('Titulo_Traduccion')
		
	#Presentación de la traducción
	self.Texto_Traduccion = self.w_tree.get_widget ('Texto_Traduccion')
	self.buffer1 = gtk.TextBuffer(table=None)
	self.Texto_Traduccion.set_buffer(self.buffer1)
	self.Barras2 = self.w_tree.get_widget ('Barras2')
	self.Barras2.add(self.Texto_Traduccion)

	#Ventana de error
	self.Error = self.w_tree.get_widget ('Error')
	self.Error.set_icon_from_file("/usr/local/share/pixmaps/Lazarillo.png")

	#Ventana de notificación de revisión sintáctica correcta
	self.Correcta = self.w_tree.get_widget ('Correcta')
	self.Correcta.set_icon_from_file("/usr/local/share/pixmaps/Lazarillo.png")
	self.Acep1 = self.w_tree.get_widget ('Acep1')
	self.Bandera_rev = False
	
	#Ventana Abrir
	self.Elegir_Abrir = self.w_tree.get_widget ('Elegir_Abrir')
	self.Elegir_Abrir.set_icon_from_file("/usr/local/share/pixmaps/Lazarillo.png")
	self.Abrir_Texto = self.w_tree.get_widget ('Abrir_Texto')
	self.Abrir_Traduccion = self.w_tree.get_widget ('Abrir_Traduccion') # Verificar antes que debe estar hecha la traducción
	self.Cancelar2 = self.w_tree.get_widget ('Cancelar2')
	self.Aceptar2 = self.w_tree.get_widget ('Aceptar2')	

	#Ventana de guardado rápido
	self.Elegir_Guardar = self.w_tree.get_widget ('Elegir_Guardar')
	self.Elegir_Guardar.set_icon_from_file("/usr/local/share/pixmaps/Lazarillo.png")
	self.Guardar_Matematica = self.w_tree.get_widget ('Guardar_Matematica')
	self.Guardar_Braille = self.w_tree.get_widget ('Guardar_Braille') # Verificar antes que debe estar hecha la traducción
	self.Cancelar = self.w_tree.get_widget ('Cancelar')
	self.Aceptar = self.w_tree.get_widget ('Aceptar')

	#Conectando todas las señales
	self.Tam_texto.connect("changed", self.on_Tam_texto, "1")
	self.Traducir.connect("clicked", self.on_Traducir, "2")
	self.Orca.connect("clicked", self.on_Orca, "3")
	self.w_tree.signal_autoconnect(dict(inspect.getmembers(self)))

    #Funcion que cierra la aplicación
    def on_Traductor_destroy(self,*args):
	gtk.main_quit()
  
    """Crea un nuevo archivo"""
    #Función Crear nuevo archivo ejecutada desde el menú
    def on_m_Nuevo(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.Nuevo()	
    """Desde el acceso directo"""
    #Función Crear nuevo archivo ejecutada desde el acceso directo	
    def on_Nuevo_clicked(self,*args):
	Traductor.on_m_Nuevo(self,*args)

    """Abrir archivo"""
    #Función Abrir archivo ejecutada desde el menú
    def on_m_Abrir_Texto(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	self.Traduccion = False
	Instancia.m_Abrir(self.Traduccion)

    def on_m_Abrir_Traduccion(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	self.Traduccion = True
	Instancia.m_Abrir(self.Traduccion)	

    def on_Abrir_clicked(self,*args):
	self.Elegir_Abrir.run()
	self.Elegir_Abrir.hide()

    def on_Aceptar2_clicked(self,*args):
	res1 = self.Abrir_Texto.get_active()
	res2 = self.Abrir_Traduccion.get_active()
	#Si se presionó el radio button Guardar_Matematica, 
	#invoca al selector de archivo correspondiente.
	if res1 == True:
		Traductor.on_m_Abrir_Texto(self,*args)
	if res2 == True:
		Traductor.on_m_Abrir_Traduccion(self,*args)

    """Funciones de la ventana Elegir_Guardar que se encuentra en el acceso directo"""   
    def on_Guardar_clicked(self,*args):
	self.Elegir_Guardar.run()
	self.Elegir_Guardar.hide()

    def on_Aceptar_clicked(self,*args):
	res1 = self.Guardar_Matematica.get_active()
	res2 = self.Guardar_Braille.get_active()
	#Si se presionó el radio button Guardar_Matematica, 
	#invoca al selector de archivo correspondiente.
	if res1 == True:
		Traductor.on_m_Matematica(self,*args)
	if res2 == True:
		self.char_count = self.buffer1.get_char_count()
		if self.char_count!=0:
			Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
			Instancia.m_Traduccion()
		else:
			self.Error.set_title("Error")
			self.Error.set_markup("No se ha realizado ninguna traducción")
			Traductor.on_Error(self,*args)	

    """Guardar por el menú"""
    #NOTA: el archivo debe tener una extensión
    def on_m_Matematica(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Matematica()

    def on_m_Traduccion(self,*args):
	self.char_count = self.buffer1.get_char_count()
	if self.char_count!=0:
		Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
		Instancia.m_Traduccion()
	else:
		self.Error.set_title("Lazarillo - Error")
		self.Error.set_markup("No se ha realizado ninguna traducción")
		Traductor.on_Error(self,*args)	

    def on_m_Guardar_C_Texto(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Guardar_C_Texto()

    def on_m_Guardar_C_Traduccion(self,*args):
	self.char_count = self.buffer1.get_char_count()
	if self.char_count!=0:
		Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
		Instancia.m_Guardar_C_Traduccion()
	else:	
		self.Error.set_title("Lazarillo - Error")
		self.Error.set_markup("No se ha realizado ninguna traducción")
		Traductor.on_Error(self,*args)

    """-----------Cambiar Traducción-------------"""
    #Ventana que permite elegir el tipo de traducción a la que se desa cambiar
    def on_m_Cambiar_Traduccion(self,*args):
	self.bandera = False
    	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
    	Instancia.on_Cambiar_Traduccion(self.bandera)

    """------------Elegir Perfil------------"""
    """Funciones de la ventana Elegir_Perfil"""
    #Ventana que permite elegir un nuevo perfil de usuario
    def on_Elegir_Perfil(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.on_Elegir_Perfil()
	
    """Imprimir"""
    #Gestor de impresión para una impresora normal
    #def on_m_Imprimir (self,*args):
    #	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
    #	Instancia.m_Imprimir()

    """Salir por el menú"""
    #Salir de la aplicación por el menú
    def on_m_Salir(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Salir()
    """Funciones de edición"""
    #Función deshacer ejecutada desde el menú, tomada desde gtksourceview
    def on_m_Deshacer(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Deshacer()

    #Función deshacer ejecutada desde el acceso directo, tomada desde gtksourceview
    def on_Deshacer_clicked(self,*args):
    	Traductor.on_m_Deshacer(self,*args)
    
    #Función rehacer ejecutada desde el menú, tomada desde gtksourceview
    def on_m_Rehacer(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Rehacer()	

    #Función rehacer ejecutada desde el acceso directo, tomada desde gtksourceview
    def on_Rehacer_clicked(self,*args):
    	Traductor.on_m_Rehacer(self,*args)

    #Función Cortar ejecutada desde el menú
    def on_m_Cortar(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Cortar()
    #Función Cortar ejecutada desde el acceso directo
    def on_Cortar_clicked(self,*args):
    	Traductor.on_m_Cortar(self,*args)

    #Función Copiar ejecutada desde el menú
    def on_m_Copiar(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Copiar()
    #Función Copiar ejecutada desde el acceso directo
    def on_Copiar_clicked(self,*args):
    	Traductor.on_m_Copiar(self,*args)

    #Función Pegar ejecutada desde el menú
    def on_m_Pegar(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Pegar()
    #Función Pegar ejecutada desde el acceso directo
    def on_Pegar_clicked(self,*args):
    	Traductor.on_m_Pegar(self,*args)
	
    #Módulo encargado de estudiar la sintaxis de las operaciones matemáticas contenidas en el archivo,
    #dicha función puede ser ejecutada manualmente por el usuario o invocada directamente por el modulo
    #de traducción antes de traducir las operaciones matemáticas.
    def on_m_Revisar_sintaxis(self,*args):
	f = open('Temporal.temp','w')
	start, end = self.buf.get_bounds()
	#Se copia el contenido del buffer en un archivo temporal para ir substrayendo línea por línea
	#las operaciones matemáticas
        f.write(self.buf.get_text(start, end, True)+"\n")
	f.close()
	f = open('Temporal.temp','r')
	#Contador de líneas
	self.contador=0
	while True:
		self.operacion = f.readline()
		if not self.operacion: break
		self.contador=self.contador+1
		resultado=Traductor.Revisar(self,self.operacion,self.contador)
		if resultado == False:
			break
		
	f.close()
	#os.remove(f)
    
    #Para cerrar la ventana de información de "Sintaxis Correcta"
    def on_Acep1_clicked(self,*args):
	self.Correcta.hide()

    def Revisar(self,*args):
	cont=0
	band=False
	#Cadena auxiliar
	self.aux = ''
	#Para revisar si la operación está resuelta correctamente
	self.numero = ''
	self.signo = ''
	self.num = 0.0
	self.Calculadora = ''
	self.Calcular = 0.0
	self.resultado = ''
	b = False
	#Cadena con más símbolos
	Cadena='ºª·""|\!#$%&()?''Çç~¡¿[]`´{}_:;<>@àèìòùáéíóúüabcdefghijklmnñopqrstuÛvwyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ'
	tam = len(self.operacion)-2
	self.letra = self.operacion[tam]
	if self.operacion.find('=')!=-1:
		b = True
	#p.e: /3=1
	if self.operacion[0]=='x' or self.operacion[0]=='/' or self.operacion[0]==',' or self.operacion[0]=='.'or Cadena.find(self.operacion[0])!=-1:
		self.Tipo_Error = "Caracter no permitido al comienzo de la línea "
		Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
		return False
	#p.e: 4+8=1+
	if Traductor.Es_Simbolo(self,self.letra)==True or Cadena.find(self.operacion[tam])!=-1:
		self.Tipo_Error = "Caracter no permitido al final de la línea "
		Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
		return False
	for i in range(0,tam+1):
		if Cadena.find(self.operacion[i])!=-1:
			self.Tipo_Error = "Caracter no permitido en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='+' and self.operacion[i+1]=='-': 
			self.Tipo_Error = "Signo más (+) seguido de un\n signo menos (-) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='+' and self.operacion[i+1]==',':
			self.Tipo_Error = "Signo más (+) seguido de una\n coma (,) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='+' and self.operacion[i+1]=='.':
			self.Tipo_Error = "Signo más (+) seguido de un\n punto (.) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='+' and self.operacion[i+1]=='/':
			self.Tipo_Error = "Signo más (+) seguido de un\n signo de división (/) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='+' and self.operacion[i+1]=='x':
			self.Tipo_Error = "Signo más (+) seguido de un\n signo de multiplicar (x) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='+' and self.operacion[i+1]=='=':
			self.Tipo_Error = "Signo más (+) seguido de un\n signo igual (=) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='+' and self.operacion[i+1]=='+':  
			self.Tipo_Error = "Signo más (+) seguido de otro\n signo más (+) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='-' and self.operacion[i+1]=='+': 
			self.Tipo_Error = "Signo menos (-) seguido de un\n signo más (+) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='-' and self.operacion[i+1]==',':
			self.Tipo_Error = "Signo menos (-) seguido de una\n coma (,) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='-' and self.operacion[i+1]=='.':
			self.Tipo_Error = "Signo menos (-) seguido de un\n punto (.) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='-' and self.operacion[i+1]=='/':
			self.Tipo_Error = "Signo menos (-) seguido de un\n signo de división (/) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='-' and self.operacion[i+1]=='x':
			self.Tipo_Error = "Signo menos (-) seguido de un\n signo multiplicar (x) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='-' and self.operacion[i+1]=='=':
			self.Tipo_Error = "Signo menos (-) seguido de un\n signo igual (=) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='-' and self.operacion[i+1]=='-':
			self.Tipo_Error = "Signo menos (-) seguido de otro\n signo menos (-) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='.' and self.operacion[i+1]=='+': 
			self.Tipo_Error = "Punto (.) seguido de un\n signo más (+) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='.' and self.operacion[i+1]=='-':
			self.Tipo_Error = "Punto (.) seguido de un\n signo menos (-) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='.' and self.operacion[i+1]==',':
			self.Tipo_Error = "Punto (.) seguido de una\n coma (,) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='.' and self.operacion[i+1]=='/':
			self.Tipo_Error = "Punto (.) seguido de un\n signo de división (/) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='.' and self.operacion[i+1]=='x':
			self.Tipo_Error = "Punto (.) seguido de un\n signo multiplicar (x) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='.' and self.operacion[i+1]=='=': 
			self.Tipo_Error = "Punto (.) seguido de un\n signo igual (=) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='.' and self.operacion[i+1]=='.':
			self.Tipo_Error = "Punto (.) seguido de otro punto (.) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='x' and self.operacion[i+1]==',':
			self.Tipo_Error = "Signo multiplicar (x) seguido de una\n coma (,) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='x' and self.operacion[i+1]=='/':
			self.Tipo_Error = "Signo multiplicar (x) seguido de un\n signo de división (/) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='x' and self.operacion[i+1]=='.':
			self.Tipo_Error = "Signo multiplicar (x) seguido de un\n punto (.) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='x' and self.operacion[i+1]=='=':
			self.Tipo_Error = "Signo multiplicar (x) seguido de un\n signo igual (=) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='x' and self.operacion[i+1]=='x':  
			self.Tipo_Error = "Signo multiplicar (x) seguido de otro\n signo multiplicar (x) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='/' and self.operacion[i+1]==',':
			self.Tipo_Error = "Signo de dividir (/) seguido de una\n coma (,) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='/' and self.operacion[i+1]=='/':
			self.Tipo_Error = "Signo de dividir (/) seguido de otro\n signo de dividir (/) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='/' and self.operacion[i+1]=='.':
			self.Tipo_Error = "Signo de dividir (/) seguido de un\n punto (.) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='/' and self.operacion[i+1]=='=':
			self.Tipo_Error = "Signo de dividir (/) seguido de un\n signo igual (=) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='/' and self.operacion[i+1]=='x':
			self.Tipo_Error = "Signo de dividir (/) seguido de un\n signo multiplicar (x) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='=' and self.operacion[i+1]==',':
			self.Tipo_Error = "Signo igual (=) seguido de una\n coma (,) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='=' and self.operacion[i+1]=='/':
			self.Tipo_Error = "Signo igual (=) seguido de un\n signo de dividir (/) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='=' and self.operacion[i+1]=='.':
			self.Tipo_Error = "Signo igual (=) seguido de un\n punto (.) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='=' and self.operacion[i+1]=='=':
			self.Tipo_Error = "Signo igual (=) seguido de otro\n signo igual (=) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]=='=' and self.operacion[i+1]=='x':
			self.Tipo_Error = "Signo igual (=) seguido de un\n signo multiplicar (x) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]==',' and self.operacion[i+1]==',':
			self.Tipo_Error = "Coma (,) seguida de otra\n coma (,) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]==',' and self.operacion[i+1]=='/':
			self.Tipo_Error = "Coma (,) seguida de un\n signo de dividir (/) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]==',' and self.operacion[i+1]=='.':
			self.Tipo_Error = "Coma (,) seguida de un\n punto (.) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]==',' and self.operacion[i+1]=='=':
			self.Tipo_Error = "Coma (,) seguida de un\n signo igual (=) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]==',' and self.operacion[i+1]=='x':
			self.Tipo_Error = "Coma (,) seguida de un\n signo multiplicar (x) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]==',' and self.operacion[i+1]=='+':
			self.Tipo_Error = "Coma (,) seguida de un\n signo más (+) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		elif self.operacion[i]==',' and self.operacion[i+1]=='-':
			self.Tipo_Error = "Coma (,) seguida de un\n signo menos (-) en la línea "
			Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
			return False
		if self.operacion[i].isdigit():
			self.aux=self.aux + self.operacion[i]
			self.numero = self.numero + self.operacion[i]
		if self.operacion[i]==',':
			self.aux=self.aux+self.operacion[i]
			self.numero = self.numero + '.'
		if self.operacion[i]=='.':
			self.aux=self.aux + self.operacion[i]
		elif i==tam or self.operacion[i]=='+' or self.operacion[i]=='-' or self.operacion[i]=='x' or self.operacion[i]=='/' or self.operacion[i]=='=':
			
			result = Traductor.Revisar_Numero(self,self.aux)
			if result==False:
				self.Error.set_title("Lazarillo - Error de sintaxis")
				valores = {'cadena' : self.aux, 'linea' : self.contador }
				self.Error.set_markup("Error:\n El número %(cadena)s está mal escrito en la línea %(linea)s" % valores )
				Traductor.on_Error(self,*args)
				return False
			else:
				#Para la calculadora
				
				if i==tam:
					if b==False:
						return True
					else:
						self.resultado = self.signo + self.numero
						if str(self.Calcular) == self.resultado:
							if self.Bandera_rev == False:
								self.Correcta.set_markup("Revisión sintáctica finalizada con éxito" )
								self.Correcta.show()
							return True
						else:
							self.Tipo_Error = "El resultado de la operación es incorrecto en la línea "
							Traductor.Anuncio_Error_Sintaxis(self,self.Tipo_Error,self.contador)
							return False

				elif self.operacion[i]=='=':
					self.Calculadora = self.Calculadora + self.numero
					self.Calcular = eval(self.Calculadora)#necesito truncar el resultado
					#Para aceptar resultados negativos o números positivos explícitos 
					if self.operacion[i+1]=='-' or self.operacion[i+1]=='+':
						self.signo = self.operacion[i+1]
					
				elif self.operacion[i]!='=':
					if self.operacion[i]=='x':
						self.Calculadora = self.Calculadora + self.numero + '*'
					else:
						self.Calculadora = self.Calculadora + self.numero + self.operacion[i]
				
				self.aux = ''
				self.numero = ''
				self.num = 0.0
				
	return True

    def Es_Simbolo(self,*args):
	simbolos="+-x/,=."
	if simbolos.find(self.letra)==-1:
		return False
	else:
		return True

    def Revisar_Numero(self,*args):
	#Para el control de las comas
	tam = len(self.aux)
	contador=0
	punto=False
	comas=0
	decimales=0
	Otro_Cont=0
	self.Tam_Miles=0
	for i in range(0,tam):
		if self.aux[i].isdigit():
			contador=contador+1
			
		if self.aux[i]==',':
			comas=comas+1
			
		if comas==1 and self.aux[i].isdigit():
			decimales=decimales+1
			
		#Si hay más de tres dígitos a la derecha del punto o ya hubo una coma
		elif contador>3 or comas>1:
			return False
		if self.aux[i]=='.':
			punto=True
			contador=0
			self.Tam_Miles=0
			self.miles=''
			j=i+1
			for j in range (j,tam):
				Otro_Cont = Otro_Cont+1
				self.Tam_Miles= self.Tam_Miles+1
				self.miles = self.miles + self.aux[j]
			result = Traductor.miles(self,self.miles,self.Tam_Miles)
			if result==True:
				continue
			elif result==False:
				return False
		if self.aux[i]=='.'and contador==3 and comas<=1:
			contador=0
			punto=False
	return True

    def miles(self,*args):
	cont=0
	for k in range (0,self.Tam_Miles):
		if self.miles[k].isdigit():
			cont=cont+1
			if cont == self.Tam_Miles and cont<=2:
				return False
		elif cont<=2 and self.miles[k]==",":
			return False
		elif cont<=2 and self.miles[k]==".":
			return False
	return True

    def Anuncio_Error_Sintaxis(self,*args):
	self.Error.set_title("Lazarillo - Error de sintaxis")
	valores = {'cadena' : self.Tipo_Error, 'linea' : self.contador }
	self.Error.set_markup("Error:\n %(cadena)s %(linea)s" % valores )
	Traductor.on_Error(self,*args)	
	
    #Función ejecutada desde el menú, selecciona todo el contenido del archivo
    def on_m_Seleccionar_todo(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Seleccionar_todo()

    """-------------Buscar---------------"""
    def on_m_Ir_a(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Ir_a()

    """------------Traducir--------------"""
    #Módulo de traducción del menú de operaciones matemáticas a Braille grado 1    
    def on_m_Braille_Grado_1(self,*args):
	self.char_count = self.buf.get_char_count()
	if self.char_count >0:
		self.Bandera_rev= True
		#Validar como en castellano
		start, end = self.buffer1.get_bounds()
		self.buffer1.delete(start,end)
		f = open('Temporal.temp','w')
		start, end = self.buf.get_bounds()
		#Se copia el contenido del buffer en un archivo temporal para ir substrayendo línea por línea
		#las operaciones matemáticas
	        f.write(self.buf.get_text(start, end, True)+"\n")
		f.close()
		f = open('Temporal.temp','r')
		self.contador=0
		while True:
			self.operacion = f.readline()
			if not self.operacion: break
			self.contador=self.contador+1
			resultado=Traductor.Revisar(self,self.operacion,self.contador)		
			if resultado == False:
				break
		f.close()
		if resultado == True:
			cont=1
			aux=''
			aux2=''
			lineas=[]
			f = open('Temporal.temp','r')
			e = open('Temporal1.temp','w')
			while True:
				op = f.readline()
				tamanio = len(op)-1
				if not op: break
				for k in range(0,tamanio):
					aux = aux + op[k]
					if tamanio==1:
						aux = "#"+aux
						lineas.append(aux+'\n')
						lineas.append('\n')
						aux=''
						aux2=''
						cont=1
						break
						
					elif op[k]=='+' or op[k]=='-' or op[k]=='x' or op[k]=='/' or op[k]=='=' or tamanio==cont:	
						if op[k]=='-' and op[k-1]=='=':
							aux2 = aux2+ aux
							aux=''
						elif k==0:
							if op[0]=='+' or op[0]=='-':
								aux2 = aux2+ aux
								print "aux2 ", aux2
								aux=''
						else:					
							aux ="#" + aux
							aux2 = aux2 + aux
							aux=''
							if tamanio==cont:
								lineas.append(aux2+'\n')
								lineas.append('\n')
								aux=''
								aux2=''
								cont=1
								break
					cont=cont+1
			e.writelines(lineas)
			del lineas
			e.close()
			f.close()
			f = open('Temporal1.temp','r').readlines()
			i=0
			for i in range (len(f)):	
				self.buffer1.insert_at_cursor(f[i])
				self.Texto_Traduccion.set_buffer(self.buffer1)
			del f
			#Obtengo los iteradores del buffer
			start, end = self.buffer1.get_bounds()
			#Creo la etiqueta asociada al buffer
			self.tag = self.buffer1.create_tag(None)
			#Se asigna la propiedad a la etiqueta
			self.tag.set_property("font", "Brailefont 28")
			self.buffer1.apply_tag(self.tag, start, end)
			self.Texto_Traduccion.set_editable(False)
			self.m_Traduccion.set_sensitive(True)
			self.Guardar_Braille.set_sensitive(True)	
			os.remove('Temporal.temp')
			os.remove('Temporal1.temp')
	else:
		self.Error.set_title("Lazarillo - Error")
		self.Error.set_markup("No hay texto a traducir en este archivo")
		Traductor.on_Error(self,*args)		
	
    #Permite realizar la traducción desde el acceso directo
    def on_Traducir(self,*args):
    	Traductor.on_m_Braille_Grado_1(self,*args)
    
    """Ayuda"""
    #Muestra el Manual de Ayuda del sistema
    def on_m_Manual_Ayuda(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Manual_Ayuda()

    #Muestra informarción sobre el sistema
    def on_m_Acerca_de(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.m_Acerca_de()
	
    """Caja combo para elegir el tamaño del texto"""
    def on_Tam_texto(self,*args):
	#Obtengo los iteradores del buffer
	start, end = self.buf.get_bounds()
	#Función que me devuelve el tamaño de texto escogido
	#por medio de la caja combo
	tam = Traductor.get_active_text(self,*args)
	#Creo la etiqueta asociada al buffer
	self.tag = self.buf.create_tag(None)
	#Se asigna la propiedad a la etiqueta
	self.tag.set_property("size_points", float(tam))
	#Se aplica la etiqueta a todo el texto que
	#se encuentre entre start y end
	self.buf.apply_tag(self.tag, start, end)
		
    #Retorna el texto activo en el ComboBox
    def get_active_text(self,*args):
	model = self.Tam_texto.get_model()
	active = self.Tam_texto.get_active()
	if active < 0:
		return None
	return model[active][0]

    """Área de Accesibilidad"""
    #Permite activar o desactivar desde la aplicación las funcionalidades brindadas por ORCA: Lector de pantalla y magnificador
    def on_Matar_Orca(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.Matar_Orca()

    def on_Orca(self,*args):
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.Orca()

    def on_Magnificador(self,*args):
	Traductor.on_Matar_Orca(self)
	Instancia = Util(self.buf,self.buffer1,self.clipboard,self.Traductor,self.Texto,self.Texto_Traduccion,self.Titulo_Traduccion)
	Instancia.Magnificador()
   
    """Funciones de la ventana de Error"""
    #Ventana genérica para anunciar un error al usuario
    def on_Error(self, *args):
	self.Error.run()
	self.Error.hide()

    """Mostrar Traductor"""
    #Se carga la aplicación
    def main(self,*args):
	self.Traductor.set_title("Sin nombre - Lazarillo")
	self.m_Imprimir.set_sensitive(False)
	self.Traductor.show()
	self.Tam_texto.show()
	self.image.show()
	self.Traducir.show()
	self.image1.show()
	self.Orca.show()
	#Textview usado para gtksourceview
	self.Texto.show()
	gtk.main()

"""Ejecutar Traductor"""
if __name__=="__main__":
    try:
	app = Traductor()
    	app.main()
    except KeyboardInterrupt:
		pass

